// 这个小仓库将来只放用户相关的数据..
// token
import { reqLogin, reqGetProfile, reqGetBaseInfo } from '@/api/user'
import { resetRouter } from '@/router'
import { getToken, setToken, removeToken } from '@/utils/auth'

const state = {
  token: getToken() || '',
  userInfo: {}
}
// 仓库数据的更新只能通过mutations
const mutations = {
  // 提供一个修改token的mutation  => this.$store.commit('user/setToken', 'xxxxxxxxxxx')
  setToken(state, newToken) {
    // 1.把token存在store
    state.token = newToken
    // 2.token存在本地cookie
    setToken(newToken)
  },
  // 提供一个清除token的mutation
  removeToken(state) {
    state.token = ''
    // 清除cookie中的token
    removeToken()
  },
  setUserInfo(state, newUserInfo) {
    state.userInfo = newUserInfo
  },
  // 移除个人信息 提供一个mutation
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  // actions是用于封装异步代码, 得到结果后, 提交mutation
  // actions 可以直接用于提交mutation
  // 提供一个actions, 专门用于提交mutation
  logout(context) {
    context.commit('removeToken')
    context.commit('removeUserInfo')
    // 退出 需要去重置路由
    resetRouter()
    // 更新一下路由模块
    // 新语法: 在A模块中要提交B模块的mutation, 传第三个参数{root: true}
    // 第三个参数的意义是: 将来会从全局出发, 去找permission/setRoutes
    context.commit('permission/setRoutes', [], { root: true })

    // 重置主题色
    context.commit('settings/resetTheme', null, { root: true })
  },
  async login(context, obj) {
    const res = await reqLogin(obj)
    context.commit('setToken', res.data)
    return res
  },
  // login(context, obj) {
  //   // 调用登录
  //   return new Promise((resolve, reject) => {
  //     // ----------------------------------------
  //     reqLogin(obj).then((res) => {
  //       // res.data.data
  //       console.log(res, 666777)
  //       context.commit('setToken', res.data)

  //       // 当你整个登录操作(异步)成功以后, 会调用成功函数, promise就会成功
  //       resolve(res)
  //     }).catch((err) => {
  //       // 当你整个登录操作(异步)失败以后, 会调用失败函数, promise就会失败
  //       reject(err)
  //     })
  //     // ----------------------------------------
  //   })

  //   // const res = await reqLogin(obj)
  //   // // console.log(res, 666)
  //   // context.commit('setToken', res.data.data)
  // },
  async getUserInfo(context) {
    // async函数默认就会返回一个promise, 其实就是相当于帮我们包裹了一层promise!!!
    // 目标: 不想自己套一层promise, 也能够实现在用这个action 异步结束之后,做某件事
    const { data: data1 } = await reqGetProfile()
    // console.log(res, 7474)
    const { data: data2 } = await reqGetBaseInfo(data1.userId)
    console.log('包含头像的用户资料', data1, data2)

    // 合并数据
    const resultObj = {
      ...data1,
      ...data2
    }

    context.commit('setUserInfo', resultObj)
    // 在async函数中 return 结果 相当于 之前在promise里 resolve(结果)
    return resultObj
  }
  // getUserInfo(context) {
  //   return new Promise((resolve, reject) => {
  //     // --------------------------------------------
  //     // 封装一个action 发请求
  //     reqGetProfile().then((res) => {
  //       // console.log(res, 1678)
  //       context.commit('setUserInfo', res.data)
  //       resolve(res)
  //     }).catch((err) => {
  //       reject(err)
  //     })
  //     // --------------------------------------------
  //   })
  // }
}
const getters = {}

export default {
  // 封闭
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}
